<?php
class MonitoreoModel extends CustomModel
{

    public function getViajeActivo($idViaje)
    {
        $viajesAbm = new ABM('viajes');
        $joins = array(
            'conductores' => array('viajes.fkconductor' => 'conductores.idconductor'),
            'vehiculos'   => array('viajes.fkvehiculo'  => 'vehiculos.idvehiculo'),
            'grupos'      => array('viajes.fkgrupo'     => 'grupos.idgrupo'),
        );
        if ($viaje = $viajesAbm->getWithJoin($filter = array('idviaje' => $idViaje, 'status' => STATUS_ONLINE),$joins, 20, 'salida_timestamp ASC', true))
        {
            return $viaje[$idViaje];
        }
        else
        {
            return false;
        }
    }

    public function getGeolocalizaciones($fkViaje, $fromId = false)
    {
        $geoLocalizacionesAbm = new ABM('geolocalizaciones');
        if (is_array($fkViaje))
        {
            $filter = new dbFilter('fkviaje', 'IN', $fkViaje);
        }
        else
        {
            $filter = new dbFilter('fkviaje', '=', $fkViaje);
        }
        if (!empty($fromId))
        {
            $idFilter = new dbFilter('idgeolocalizacion', '>', $fromId);
            $filter = new dbFilter($filter, 'AND', $idFilter);
        }
        return $geoLocalizacionesAbm->get($filter, array('idgeolocalizacion ASC'));
    }

    public function getGeolocazionesPorGrupo($viajesIds, $fromId = false)
    {
        $geoLocalizacionesAbm = new ABM('geolocalizaciones');
        if (is_array($viajesIds))
        {
            $filter = new dbFilter('fkviaje', 'IN', $viajesIds);
        }
        else
        {
            $filter = new dbFilter('fkviaje', '=', $viajesIds);
        }
        if (!empty($fromId))
        {
            $tsFilter = new dbFilter('idgeolocalizacion', '>', $fromId);
            $filter = new dbFilter($filter, 'AND', $tsFilter);
        }
        return $geoLocalizacionesAbm->get($filter, array('idgeolocalizacion ASC'));
    }

    public function getGruposActivos()
    {
        $grupoStat = new dbFilter('grupos.status', '<>', STATUS_OFFLINE);
        $viajeStat = new dbFilter('viajes.status', '=', STATUS_ONLINE);
        $filter    = new dbFilter($grupoStat, 'AND', $viajeStat);
        $grupos    = $this->db->select('grupos.*', 'COUNT(viajes.idviaje) AS viajes_activos')->from('grupos')->join('viajes')->on('viajes.fkgrupo', '=', 'grupos.idgrupo')->where($filter)->groupBy('grupos.idgrupo')->having('viajes_activos', '>', 0)->get();
        return $grupos;
    }

    public function getGrupoActivo($id)
    {
        $grupoStat = new dbFilter('grupos.status', '<>', STATUS_OFFLINE);
        $viajeStat = new dbFilter('viajes.status', '=', STATUS_ONLINE);
        $idFilter  = new dbFilter('idgrupo', '=', $id);
        $filter    = new dbFilter($grupoStat, 'AND', $viajeStat);
        $filter    = new dbFilter($filter, 'AND', $idFilter);
        $grupos    = $this->db->select('grupos.*', 'COUNT(viajes.idviaje) AS viajes_activos')->from('grupos')->join('viajes')->on('viajes.fkgrupo', '=', 'grupos.idgrupo')->where($filter)->groupBy('grupos.idgrupo')->having('viajes_activos', '>', 0)->get();
        return $grupos;
    }

    public function getViajesActivosByGrupo($id)
    {
        $viajesAbm = new ABM('viajes');
        $joins = array(
            'conductores' => array('viajes.fkconductor' => 'conductores.idconductor'),
            'vehiculos'   => array('viajes.fkvehiculo'  => 'vehiculos.idvehiculo'),
            'grupos'      => array('viajes.fkgrupo'     => 'grupos.idgrupo'),
        );
        if ($viajes = $viajesAbm->getWithJoin($filter = array('fkgrupo' => $id, 'status' => STATUS_ONLINE),$joins, 20, 'salida_timestamp ASC', true))
        {
            return $viajes;
        }
        else
        {
            return false;
        }
    }

    public function getViajesActivosByIds($ids)
    {
        $viajesAbm = new ABM('viajes');
        $joins = array(
            'conductores' => array('viajes.fkconductor' => 'conductores.idconductor'),
            'vehiculos'   => array('viajes.fkvehiculo'  => 'vehiculos.idvehiculo'),
            'grupos'      => array('viajes.fkgrupo'     => 'grupos.idgrupo'),
        );
        if ($viajes = $viajesAbm->getWithJoin($filter = array('idviaje' => $ids, 'status' => STATUS_ONLINE),$joins, 20, 'salida_timestamp ASC', true))
        {
            return $viajes;
        }
        else
        {
            return false;
        }
    }

    public function getRutas($idRutas)
    {
        $rutaABM = new ABM('rutas');
        if (is_array($idRutas))
        {
            $idFilter = new dbFilter('idruta', 'IN', $idRutas);
        }
        else
        {
            $idFilter = new dbFilter('idruta', '=', $idRutas);
        }
        if ($rutas = $rutaABM->get($idFilter))
        {
            foreach ($rutas as $idRuta => &$ruta)
            {
                // Ruta
                $ruta['puntos_camino'] = unserialize($ruta['camino']);
                // Puntos
                $puntosABM = new ABM('puntos_por_ruta');
                $puntosFranjaABM = new ABM('tiempo_por_franja_por_punto');
                $ruta['puntos'] = $puntosABM->get(array('fkruta' => $idRuta), 'orden ASC');
                $ruta['puntos_por_franja'] = $puntosFranjaABM->get(array('fkruta' => $idRuta), false, false, false);
            }
            return $rutas;
        }
        else
        {
            return false;
        }
    }

    public function getVehiculos($idVehiculos)
    {
        $vehiculosAbm = new ABM('vehiculos');
        return $vehiculosAbm->get(new dbFilter('idvehiculo', 'IN', $idVehiculos));
    }

    public function setGrupoInfo($randSessionKeyGrupo, $idGrupo, $rutasIds, $viajesIds, $oldestGeo)
    {
        $info = array(
            'idgrupo'    => $idGrupo,
            'rutas'      => $rutasIds,
            'viajes'     => $viajesIds,
            'last_check' => $oldestGeo
        );
        $this->session->set($randSessionKeyGrupo, $info);
        return true;
    }

    public function getGrupoInfo($randSessionKeyGrupo)
    {
        return $this->session->get($randSessionKeyGrupo);
    }

}
?>